using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using ProjetoControlePagamento.CamadaAcessoDadosNH;
using ProjetoControlePagamento.Dados.Entidades;
using ProjetoControlePagamento.Servicos.Controladores;

namespace ProjetoControlePagamento.Servicos
{
    public class Fachada
    {
        #region Atributos

        private static Fachada _unique = null;

        private ControladorUsuario _controladorUsuario;
        private ControladorEmpresa _controladorEmpresa;

        #endregion
        
        #region GetInstancia

        public static Fachada GetInstancia()
        {
            if (_unique == null)
            {
                _unique = new Fachada();
            }

            return _unique;
        }

        #endregion

        #region Construtor

        public Fachada()
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");

            _controladorUsuario = new ControladorUsuario();
            _controladorEmpresa = new ControladorEmpresa();
        }

        #endregion

        #region Usuarios

        public Usuario Inserir(Usuario usuario)
        {
            Usuario usuariotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                usuariotmp = _controladorUsuario.Inserir(usuario);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                usuariotmp = null;
                throw;
            }

            return usuariotmp;
        }

        public Usuario Atualizar(Usuario usuario)
        {
            Usuario usuariotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                usuariotmp = _controladorUsuario.Atualizar(usuario);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                usuariotmp = null;
                throw;
            }

            return usuariotmp;
        }

        public void ExcluirUsuario(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _controladorUsuario.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                throw;
            }
        
        }

        public IList<Usuario> ObterTodosUsuario()
        {
            return _controladorUsuario.ObterTodos();
        }

        public Usuario ObterUsuarioPorId(int id)
        {
            return _controladorUsuario.ObterPorId(id);
        }

        #endregion

        #region Empresa

        public Empresa Inserir(Empresa empresa)
        {
            Empresa empresatmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                empresatmp = _controladorEmpresa.Inserir(empresa);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                empresatmp = null;
                throw;
            }

            return empresatmp;
        }

        public Empresa Atualizar(Empresa empresa)
        {
            Empresa empresatmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                empresatmp = _controladorEmpresa.Atualizar(empresa);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                empresatmp = null;
                throw;
            }

            return empresatmp;
        }

        public void ExcluirEmpresa(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _controladorEmpresa.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                throw;
            }
           
        }

        public IList<Empresa> ObterTodasEmpresas()
        {
            return _controladorEmpresa.ObterTodos();
        }

        public Empresa ObterEmpresaPorId(int id)
        {
            return _controladorEmpresa.ObterPorId(id);
        }

        #endregion
    }
}